package ordersystem.advice;

import com.zqu.ordersystem.myexception.BusinessException;
import com.zqu.ordersystem.pojo.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice  // 用于标识当前类为REST风格对应的异常处理器，适用于所有控制器
public class ProjectExceptionAdvice {

    // 统一处理所有的Exception异常
    @ExceptionHandler(Exception.class)  // 捕获所有异常
    public Result doOtherException(Exception ex) {
        Result result = new Result(null, "系统错误", 500);  // 创建一个Result对象，状态码为500，消息为“系统错误”
        result.setData(ex.getMessage());  // 设置异常信息
        return result;  // 返回Result对象，响应给客户端
    }

    // 统一处理BusinessException异常
    @ExceptionHandler(BusinessException.class)  // 捕获业务异常
    public Result doBusinessException(BusinessException e) {
        Result r = new Result();  // 创建一个Result对象
        // 根据不同的异常类型，返回不同的错误信息
        switch (e.getCode()) {
            case BUS_ID_NOT_FOUND:  // ID未找到
                r = Result.fail(501, "ID找不到");  // 设置状态码和消息
                r.setData(e.getMessage());  // 设置异常信息
                break;
            case BUS_INTEGER_ABC:  // 参数ABC不符合要求
                r = Result.fail(502, "参数ABC不符合要求");
                r.setData(e.getMessage());
                break;
            case BUS_INVALID_TOKEN:  // Token不合法
                r = Result.fail(444, "Token不合法");
                r.setData(e.getMessage());
                break;
            case DISH_NOT_FOUND:  // 菜品找不到
                r = Result.fail(503, "菜品找不到");
                r.setData(e.getMessage());
                break;
            default:  // 其他异常
                r.setMsg(e.getMessage());  // 设置消息
                r.setCode(505);  // 设置状态码
                break;
        }
        return r;  // 返回Result对象，响应给客户端
    }
}



//@RestControllerAdvice：这是一个Spring注解，用于定义一个全局的异常处理器，适用于所有控制器（@RestController）。它可以捕获和处理所有控制器中抛出的异常。
//@ExceptionHandler：这是一个方法级别的注解，用于指定某个方法处理特定类型的异常。例如，@ExceptionHandler(Exception.class)表示该方法处理所有Exception类型的异常。
//Result类：这是一个自定义的响应类，用于封装返回给客户端的响应数据。它包含三个主要字段：data（响应数据）、msg（响应消息）、code（响应状态码）。
//BusinessException：这是一个自定义的业务异常类，用于处理业务逻辑中的异常情况。它包含一个code字段，用于标识异常类型。
//switch语句：用于根据不同的异常类型返回不同的响应信息。每个case对应一种异常类型，default用于处理未明确指定的异常类型。